package com.cskaoyan.javase.oop3._1interface._4example;

import com.cskaoyan.javase.oop3._1interface._4example.controller.IGoodsOperation;
import com.cskaoyan.javase.oop3._1interface._4example.controller.impl.IGoodsOperationImpl;
import com.cskaoyan.javase.oop3._1interface._4example.model.Goods;

/**
 * 测试类
 *
 * 某电商系统后台
 * 前端程序员需要后端程序员，提供接口来完成库存的管理，展示页面。
 * 假如前后端商量好，要求：
 *      1.展示全部商品（goods）页面时，将仅装有商品对象的数组返回，前端不提供任何数据。
 *      分析:
 *      该展示全部商品的操作,这个操作不需要任何数据
 *      然后还需要返回一个不带有null的商品数组
 *      方法的形参是: ()
 *      方法的返回值类型是: Goods[]
 *      需要做的事情: 排除数据源数组中的null元素
 *
 *      2.新增商品时，前端提供商品各种参数，后端需要校验ID唯一性，然后将对象插入数组，返回插入结果。
 *      分析:
 *      插入方法的结果有几种?
 *              1.成功了
 *              2.失败了,但原因是id重复了
 *              3.失败了,但原因是数组满了
 *      既然有三种结果,用布尔类型就不行了
 *      咱们可以考虑方法返回一个状态码:
 *          0: 表示成功了
 *          1: 失败了,但原因是id重复了
 *          2: 失败了,但原因是数组满了
 *
 *      这个插入商品的方法
 *      它的形式列表是 (商品的各种参数)
 *      它的返回值类型是int类型
 *
 *      3.删除商品时，前端提供商品ID，后端将该商品删除后，返回删除删除结果。（成功返回true，找不到该ID的商品返回false）
 *      ....
 * 在这里,我们就要使用面向对象的思想,以及interface提供开发规范标准来实现这个需求.
 * 面向对象思想的程序,是以对象为核心开发程序
 * 在一个程序当中,对象是很多的,但是这些对象也是可以分类的,不同的对象虽然功能不同,但也有相似的地方
 * 这些相似功能的对象,我们把它们放在一个package下面,这样某一个package下的所有对象,就来实现一类相似的功能
 * 对程序中所有的对象就行这样的分类,就形成了分层的逻辑.
 * JavaEE当中的"MVC"思想,等到后面再学,今天咱们就只谈分层的思想,不是MVC
 *
 * 有了分层思想后,我们把以上对商品数组进行增删改成,并展示页面的操作,进行一个分层(到底分几层,具体怎么分,可以是不确定的):
 *      "前端页面"要求我们展示商品数据,这时页面会给我们传递一些信息,用于后端进行查询,这时就要依赖于后端给出一个商品展示结果
 *      --> (Controller层 控制层) 该层负责对外提供业务操作的服务,比如直接提供商品数据的增删改查服务,但是控制层提供这些服务时,必然需要进行数据的操作
 *      但是该层只提供对外的服务,不推荐数据操作的功能,数据操作的功能全部依赖于下一层
 *      -->(Dao层 数据交互层) 该层对外提供数据操作的服务,所有直接和数据进行交互的逻辑都应该写在这里
 *      --> 数据交互层就直接和数据源(数据库)进行交互了
 *
 * @since 10:19
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Test {
    // 为了体现接口的规范性,这里必须使用父类引用指向子类对象的形式
    private static IGoodsOperation io = new IGoodsOperationImpl();

    // 这里模拟一个前端,向后端请求一些操作,这时就需要依赖于controller层对象
    public static void main(String[] args) {
        printRealGoods();

        System.out.println("现在开始新增一个商品:");
        switch (io.insertGoods(10, "联想笔记本", 8000, "联想")) {
            case 0:
                System.out.println("插入成功!");
                printRealGoods();
                break;
            case 1:
                System.out.println("id重复了,失败了!");
                break;
            case 2:
                System.out.println("数组满了,失败了!");
                break;
        }
    }

    private static void printRealGoods() {
        System.out.println("现在开始展示所有的商品信息");
        Goods[] real = io.getAllRealGoods();
        for (Goods goods : real) {
            goods.print();
        }
    }
}
